﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>等待按键 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The 等待按键 function waits 遍历 a key or mouse/joystick button to be released or pressed down." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>等待按键</h1>

<p>等待按键或鼠标/操纵杆按钮被松开或按下.</p>

<pre class="Syntax"><span class="func">等待按键</span> KeyName <span class="optional">, Options</span></pre>
<h2 id="Parameters">参数</h2>
<dl>

  <dt>KeyName</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>此参数可以是键盘中任何的单个字符或<a href="../KeyList.htm">按键列表</a>中的一个键名, 例如鼠标/操纵杆按钮. 不支持除操纵杆按钮外的其他操纵杆属性.</p>
      <p>还可以指定明确的虚拟按键代码, 例如 <code>vkFF</code>. 只有在一个按键没有指定名称且按下时不产生可见的字符这样少见的情况下, 这种方法才有用. 它的虚拟按键代码可以通过<a href="../KeyList.htm#SpecialKeys">按键列表页面</a>底部的步骤来确定.</p></dd>

  <dt>Options</dt>
  <dd>
      <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>
      <p>如果此参数为空, 则函数会无限期等待用户松开指定的按键或鼠标/操纵杆按钮. 不过, 如果没有安装<a href="_InstallKeybdHook.htm">键盘钩子</a>并且 <em>KeyName</em> 是使用类似 <a href="Send.htm">发送</a> 函数模拟释放的键盘按键, 则此按键会被视为物理松开了. 没有安装<a href="_InstallMouseHook.htm">鼠标钩子</a>时, 对鼠标按钮同样如此.</p>
      <p>Options: 由一个或多个下列字母组成的字符串(可任意顺序, 字母间可以用空格分隔):</p>
      <p><strong>D</strong>: 等待按键被按下.</p>            
      <p><strong>L</strong>: 检测按键的逻辑状态, 这是操作系统和活动窗口所认为的按键所处的状态(可能和它的物理状态不一致). 对于操纵杆按钮会忽略此选项.</p>
      <p><strong>T</strong>: 超时(例如 <code>T3</code>). 超时前等待的秒数, 超时后返回 0. 如果按键或按钮达到指定的状态, 则函数不再等待超时时间到期. 相反地, 它会立即返回 1.</p>
      <p>此超时时间值可以为浮点数(例如 2.5), 但不能为十六进制值(例如 0x03).</p></dd>

</dl>

<h2 id="Return_Value">返回值</h2>
<p>类型: <a href="../Concepts.htm#boolean">整数(布尔值)</a></p>
<p>如果该函数超时, 则此函数返回 0(false), 否则返回 1(true).</p>

<h2 id="Remarks">备注</h2>
<p>如果没有安装键盘和/或鼠标钩子, 则按键或鼠标按钮的物理状态通常和逻辑状态一致(有时逻辑状态可能比物理状态滞后); 如果安装了钩子, 则它会准确反映出用户是否按下了按键. 您可以通过 <a href="KeyHistory.htm">按键记录</a> 函数菜单项确定脚本中是否使用了钩子. 通过添加 <a href="_InstallKeybdHook.htm">#安装键盘钩</a> 和 <a href="_InstallMouseHook.htm">#安装鼠标钩</a> 指令到脚本中您可以强制安装其中一种或两种钩子.</p>
<p>当函数处于等待状态时, 可以通过<a href="../Hotkeys.htm">热键</a>, <a href="../objects/Menu.htm">自定义菜单项</a>或<a href="SetTimer.htm">计时器</a>启动新的<a href="../misc/Threads.htm">线程</a>.</p>
<p>要等待两个或多个按键被释放, 请连续使用 等待按键. 例如:</p>
<pre>等待按键 "Control"  <em>; 等待 Control 和 Alt 被释放.</em>
等待按键 "Alt"</pre>
<p>要等待一组按键中的任意一个被按下, 请参阅 <a href="InputHook.htm">输入钩</a> 函数的示例部分.</p>
<h2 id="Related">相关</h2>
<p><a href="GetKeyState.htm">获取按键状态</a>, <a href="../KeyList.htm">Key List</a>, <a href="InputHook.htm">输入钩</a>, <a href="KeyHistory.htm">按键记录</a>, <a href="_InstallKeybdHook.htm">#安装键盘钩</a>, <a href="_InstallMouseHook.htm">#安装鼠标钩</a>, <a href="ClipWait.htm">监听剪贴板</a>, <a href="WinWait.htm">等待窗口</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a>: 基础用法</p>
<pre>等待按键 "a"  <em>; 等待 A 被释放.</em>
等待按键 "LButton", "D"  <em>; 等待鼠标左键被按下.</em>
等待按键 "Joy1", "D T3"  <em>; 等待首个操纵杆按钮在 3 秒内被按下.</em>
等待按键 "LAlt", "L"  <em>; 等待左 Alt 键被逻辑释放.</em></pre>
</div>

<div class="ex" id="ExHotkey">
<p><a href="#ExHotkey">#2</a>: 简单的热键</p>
<pre>CapsLock::
{
    等待按键 "CapsLock"  <em>; 等待用户物理释放.</em>
    信息框 "You pressed and released the CapsLock key."
}</pre>
</div>

<div class="ex" id="ExRemap">
<p><a href="#ExRemap">#3</a>: 重映射按键或鼠标按钮(这里仅为了演示, 因为使用<a href="../misc/Remap.htm">内置的重映射功能</a>会更容易). 当 NumpadAdd 按下时持续按住鼠标左键, 这样实际上把 NumpadAdd 映射成了鼠标左键.</p>
<pre>*NumpadAdd::
{
    鼠标点击 "left",,, 1, 0, "D"  <em>; 按住鼠标左键.</em>
    等待按键 "NumpadAdd"  <em>; 等待按键被释放.</em>
    鼠标点击 "left",,, 1, 0, "U"  <em>; 释放鼠标按钮.</em>
}</pre>
</div>

<div class="ex" id="ExDouble">
<p><a href="#ExDouble">#4</a>: 检测什么时候按下了某个按键两次(类似于双击). 当您按下 RControl 修饰另一个键时, 使用 等待按键 来停止键盘自动重复功能以避免产生不想要的两次按下. 它通过保持热键线程的运行来实现这一点, 这依赖于 #单热键最大线程数 默认设置值为 1, 从而阻止自动重复. 注意: 在 <a href="SetTimer.htm">设置定时器</a> 页面的底部有一个更精巧的脚本, 能分辨出单次, 两次和三次按下的区别.</p>
<pre>~RControl::
{
    如果 (内_最近热键名 != &quot;~RControl&quot; or 内_距离上次热键触发时间 &gt; 400)
    {
        <em>; 两次按下时间间隔太长, 所以这不是按下两次.</em>
        等待按键 "RControl"
        返回
    }
    信息框 "You double-pressed the right control key."
}</pre>
</div>

</body>
</html>